package bebetes;

import java.awt.Color;
import java.util.List;

import junit.framework.TestCase;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Classe testant le comportement predateur
 *
 */
public class ComportementPredateurTest extends TestCase{

	static int largeur = 200;
	static int hauteur = 200;
	static int x1 = 50;
	static int x2 = 110;
	float directionRelative;
	ChampDeBebetes champ;
	BebeteConcrete pelican;
	BebeteConcrete tortue;
	Comportement compPred = ComportementPredateur.getComportement();
	Comportement compEmer = ComportementEmergent.getComportement();
	Color couleur;
	List<BebeteConcrete> lb;
	FabriquePlugins plugFacto;
	
	/**
	 * Initialisation du test en creant une bebete appelee pelican qui devient predateur,
	 * une bebete appelee tortue qui sera la victime
	 */
	@Before
	public void setUp() throws Exception {
		couleur = new Color(0.5f,0.5f,0.5f);
		FabriqueEntites.init(FabriquePlugins.class);
		plugFacto = (FabriquePlugins)FabriqueEntites.getFabriqueEntites();
		champ = plugFacto.creeChampDeBebetes(largeur, hauteur, 1234);
		pelican = (BebeteConcrete) plugFacto.creeBebete(champ, x1, x1, (float) (Math.PI/2), 2, couleur, compEmer, compPred);
		tortue = (BebeteConcrete) plugFacto.creeBebete(champ, x2, x2, 0.0f, 1, couleur, compEmer, null);
		champ.setNombreDeBebetes(champ.getNombreDeBebetes()+1);
	}
	
	@After
	public void tearDown() throws Exception {
		champ = null;
		plugFacto = null;
		pelican = null;
		FabriqueEntites.delete();
		
	}
	
	/**
	 * Verifie le calcul des deplacements du pelican et de la tortue
	 */
	@Test
	public void testCalculDeplacementAFaire() {
		
		float vit = pelican.getVitesseCourante();
		float dir = pelican.getDirectionCourante();
		pelican.getComportementPredateur().calculeDeplacementAFaire(pelican);
		assertTrue(vit*0.3 != pelican.getVitesseCourante() || dir != pelican.getDirectionCourante());
		
	}
	
	/**
	 * verifie que le pelican et la tortue se sont bien deplace
	 */
	@Test
	public void testEffectueDeplacement() {
		
		int tempX = pelican.getX();
		int tempY = pelican.getY();
		
		pelican.getComportementPredateur().effectueDeplacement(pelican);
		
		assertTrue(tempX != pelican.getX() || tempY != pelican.getY());
	}
	
	/**
	 * Verifie que le pelican attaque bien la tortue,
	 * lui prends son energie
	 * et que la tortue n'a plus d'energie
	 */
	@Test
	public void testAttaquer() {
		int xVictime = tortue.getX();
		int yVictime = tortue.getY();
		int enVictime = tortue.getEnergie();
		
		int xAtt = pelican.getX();
		int yAtt = pelican.getY();
		int enAtt = pelican.getEnergie();
		
		((ComportementPredateur) compPred).attaquer(pelican, tortue);
		
		assertEquals(xVictime,pelican.getX());
		assertEquals(yVictime,pelican.getY());
		assertFalse(xAtt == pelican.getX());
		assertFalse(yAtt == pelican.getY());
		assertEquals(tortue.getEnergie(), 0);
		assertFalse(enVictime == tortue.getEnergie());
		assertTrue(pelican.getEnergie() > enAtt);
	}
	
	/**
	 * Verifie qu'en agissant le pelican perds bien de l'energie
	 */
	@Test
	public void testAgit() {
		int en = pelican.getEnergie();
		
		pelican.getComportementPredateur().agit(pelican);
		
		assertTrue(en > pelican.getEnergie());
		
	}
}
